package com.elecbook.base.dto;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.*;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;


/**
 * @description 分页请求的结果，这里是使用dto作为vo，这是一个泛型
 * @author zken
 * @CreateDate 2024/10/24 20:00:26
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageDTO<V> implements Serializable {

    static final long serialVersionUID = 8545994513226528798L;

    private Long total;
    private Long pages;
    private List<V> list;


    public static <VO, PO> PageDTO<VO> of(Page<PO> p, Class<VO> clazz) {
        PageDTO<VO> pageDTO = new PageDTO<>();
        pageDTO.setTotal(p.getTotal());
        pageDTO.setPages(p.getPages());
        // 获取list序列
        if (p.getRecords() == null) {
            // 主动添加空序列
            pageDTO.setList(Collections.emptyList());
            return pageDTO;
        }

        pageDTO.setList(BeanUtil.copyToList(p.getRecords(), clazz));

        return pageDTO;
    }

//    /**
//     * 返回空分页结果
//     * @param p MybatisPlus的分页结果
//     * @param <V> 目标VO类型
//     * @param <P> 原始PO类型
//     * @return VO的分页对象
//     */
//    public static <V, P> PageDTO<V> empty(Page<P> p){
//        return new PageDTO<>(p.getTotal(), p.getPages(), Collections.emptyList());
//    }
//
//    /**
//     * 将MybatisPlus分页结果转为 VO分页结果
//     * @param p MybatisPlus的分页结果
//     * @param voClass 目标VO类型的字节码
//     * @param <V> 目标VO类型
//     * @param <P> 原始PO类型
//     * @return VO的分页对象
//     */
//    public static <V, P> PageDTO<V> of(Page<P> p, Class<V> voClass) {
//        // 1.非空校验
//        List<P> records = p.getRecords();
//        if (records == null || records.size() <= 0) {
//            // 无数据，返回空结果
//            return empty(p);
//        }
//        // 2.数据转换
//        List<V> vos = BeanUtil.copyToList(records, voClass);
//        // 3.封装返回
//        return new PageDTO<>(p.getTotal(), p.getPages(), vos);
//    }
//
//    /**
//     * 将MybatisPlus分页结果转为 VO分页结果，允许用户自定义PO到VO的转换方式
//     * @param p MybatisPlus的分页结果
//     * @param convertor PO到VO的转换函数
//     * @param <V> 目标VO类型
//     * @param <P> 原始PO类型
//     * @return VO的分页对象
//     */
//    public static <V, P> PageDTO<V> of(Page<P> p, Function<P, V> convertor) {
//        // 1.非空校验
//        List<P> records = p.getRecords();
//        if (records == null || records.size() <= 0) {
//            // 无数据，返回空结果
//            return empty(p);
//        }
//        // 2.数据转换
//        List<V> vos = records.stream().map(convertor).collect(Collectors.toList());
//        // 3.封装返回
//        return new PageDTO<>(p.getTotal(), p.getPages(), vos);
//    }
}
